;*** File Two *** > DOS02
 TTL - DOS02 -  Command Line Interpreter
 OPT &01
;* CLI *

WDCAT JSR STXYLP
 JSR DIR
 LDYIM &FF
 STY LINNO
 INY
 STY UTEMP  ;Qualifier

;Print title
CAT8 LDAAY DIRLOW
 CPYIM &08
 BCC CAT9
 LDAAY DIRHIG - &08
CAT9 JSR PCHR
 INY
 CPYIM &0C
 BNE CAT8

;Print cycle number
 JSR VSTRNG
 = " ("
 LDA CYCNO
 JSR BYTOUT

;Print drive number
 JSR VSTRNG
 = ")",CR
 = "Drive "
 LDA FDRIVE
 JSR DIGOUT

;Print option
 LDYIM &0D
 JSR YSPACE
 JSR VSTRNG
 = "Option "
 LDA OPTION
 JSR SFOUR
 PHA ;**************** HMT
 JSR DIGOUT  ;Print number
 JSR VSTRNG
 = " ("
 LDYIM &03
 PLA ;**************** HMT
 ASLA  ;Get offset in text
 ASLA
 TAX
CAT5 LDAAX OPTTBL
 JSR PCHR  ;Print text
 INX
 DEY
 BPL CAT5

;Print directory
 JSR VSTRNG
 = ")",CR,"Dir. :"
 LDA DEFDSK
 JSR DPDOT
 LDA DEFQUA
 JSR PCHR

;Print library
 LDYIM &06+&05
 JSR YSPACE
 JSR VSTRNG
 = "Lib. :"
 LDA LIBDSK
 JSR DPDOT
 LDA LIBQUA
 JSR PCHR
 JSR PCRLF

 LDYIM &00
CAT0 CPY DIRLEN
 BCS CATSCN
 LDAAY MODIFY
 EOR DEFQUA
;**************************************
; Is this the fix for LC quals?  HMT
 ANDIM &5F
; However it must still be ANDIM $7F (?) so no saving
;**************************************
 BNE CAT1
 LDAAY MODIFY
 ANDIM &80
 STAAY MODIFY
CAT1 JSR STEP
 BCC CAT0  ;Carry IS clear !!
CATSCN LDYIM &00
 JSR FINDIR ; FIND DIR ENTRY THAT
; HAS NOT BEEN MARKED
 BCC NEWBST ;  NEW BEST ENTRY
 LDAIM &FF  ;Force catalogue read next
 STA CATDRV
 JMP PCRLF

;FINDIR FINDS AN ENTRY IN THE
;CATALOG THAT HAS NOT BEEN
;MARKED NEGATIVE IN ITS 1ST
;BYTE
NXTCAT JSR STEP
FINDIR CPY DIRLEN
 BCS FINDX
 LDAAY CATLOW
 BMI NXTCAT
FINDX RTS  ; C=0 IF OK

NEWBST STY LTEMP
 LDXIM &00
CATLOP LDAAY CATLOW
 JSR SETCAP
 STAAX DOSRAM
 INY
 INX
 CPXIM &08
 BNE CATLOP
CATTRY JSR FINDIR
 BCS SCAND ; ONE SCAN COMPLETE
 SEC
 LDXIM &06
CATSBC LDAAY CATLOW + &06
 JSR SETCAP
 SBCAX DOSRAM
 DEY
 DEX
 BPL CATSBC
 JSR STEP7  ;Restore Y
 LDAAY MODIFY  ;Get qualifier
 JSR SETCAP
 SBC DOSRAM + &07
;NOW C=1 IF NEW ENTRY >= OLD
 BCC NEWBST
 JSR STEP
 BCS CATTRY

SCAND LDY LTEMP
 LDAAY CATLOW
 ORAIM &80
 STAAY CATLOW  ;Mark it as used
 LDA DOSRAM + &07  ;Qualifier
 CMP UTEMP
 BEQ SAMEQ
 LDX UTEMP
 STA UTEMP
 BNE SAMEQ
 JSR PCRLF
CAT3 JSR PCRLF
 LDYIM &FF
 BNE FIRSTC
SAMEQ LDY LINNO  ;Line used once flag
 BNE CAT3  ;Line empty so far
 LDYIM &05
 JSR YSPACE  ;Leaves Y=0
FIRSTC INY
 STY LINNO
 LDY LTEMP
 JSR PDSPC
 JSR PRTNAM
 JMP CATSCN

;Table of boot options
OPTTBL = "off",&00,"LOADRUN",&00,"EXEC"

DSKADR LDAAY CATHIG + &06
 JSR ISOLEN
 STA WORK + &08
 CLC
 LDAIM &FF
 ADCAY CATHIG + &04
 LDAAY CATHIG + &07
 ADCAY CATHIG + &05
 STA WORK + &09
 LDAAY CATHIG + &06
 ANDIM &03
 ADC WORK + &08
 STA WORK + &08
DSKSPC SEC
 LDAAY DIRHIG + &07
 SBC WORK + &09
 PHA
 LDAAY DIRHIG + &06
 ANDIM &03
 SBC WORK + &08
 TAX
 LDAIM &00
 CMP WORK + &06
 PLA
 SBC WORK + &07
 TXA
 SBC WORK + &0A
RETURN RTS

;Command table - at FS stage
COMTAB = "ACCESS"
 = !(/(ACCESS - &01 ))
 = ACCESS - &01
 = &32
 = "BACKUP"
 = !(/(CPYDSK - &01 ))
 = CPYDSK - &01
 = &04
 = "COMPACT"
 = !(/(COMPCT - &01 ))
 = COMPCT - &01
 = &07
 = "COPY"
 = !(/(CPYFIL - &01 ))
 = CPYFIL - &01
 = &24
 = "DELETE"
 = !(/(DELETE - &01 ))
 = DELETE - &01
 = &01
 = "DESTROY"
 = !(/(DESTRY - &01 ))
 = DESTRY - &01
 = &02
 = "DIR"
 = !(/(SET - &01 ))
 = SET - &01
 = &06

 [ DRIVEC=0
 = "DRIVE"
 = !(/(DRIVE - &01 ))
 = DRIVE - &01
 = &09
 |
 ]

 = "ENABLE"
 = !(/(ENABLE - &01 ))
 = ENABLE - &01
 = &00
 = "INFO"
 = !(/(INFO - &01 ))
 = INFO - &01
 = &02
 = "LIB"
 = !(/(SLIB - &01 ))
 = SLIB - &01
 = &06
 = "RENAME"
 = !(/(RENAME - &01 ))
 = RENAME - &01
 = &05
 = "TITLE"
 = !(/(TITLE - &01 ))
 = TITLE - &01
 = &08
 = "WIPE"
 = !(/(QDEL - &01 ))
 = QDEL - &01
 = &02
 = !(/(DEFCOM - &01 ))
 = DEFCOM - &01

;1st pass table - i.e. on a SWC
INITBL = "BUILD"
 = !(/(BUILD - &01 ))
 = BUILD - &01
 = &01
 = "DISC"
 = !(/(INIT - &01 ))
 = INIT - &01
 = &00
 = "DUMP"
 = !(/(DUMP - &01 ))
 = DUMP - &01
 = &01
 = "LIST"
 = !(/(LIST - &01 ))
 = LIST - &01
 = &01
 = "TYPE"
 = !(/(TYPE - &01 ))
 = TYPE - &01
 = &01
 = "DISK"
 = !(/(INIT - &01 ))
 = INIT - &01
 = &00
 = !(/(RETURN - &01 ))
 = RETURN - &01

;Help lookup table
HLPTAB = "DFS"
 = !(/(HELP - &01 ))
 = HELP - &01
 = &00
 = "UTILS"
 = !(/(PMHELP - &01 ))
 = PMHELP - &01
 = &00
 = !(/(NOHELP - &01 ))
 = NOHELP - &01

WNAME JSR STXYLP
 LDXIM &FD
WNAME0 TYA
 PHA
THUNK INX
 INX
 PLA
 PHA
 TAY
 JSR SETUPR
 INX
 LDAAX COMTAB  ;Check for EOT
 BMI FINISH
 DEX
 DEY
 STX COMTXT
FIRCH INX
 INY
COMMMM LDAAX COMTAB  ;Compare loop
 BMI CHKLST
 EORIY LINPTR
 ANDIM &5F  ;Zap lower case
 BEQ FIRCH 
 DEX
MINUS INX
 LDAAX COMTAB
 BPL MINUS
 LDAIY LINPTR
 CMPIM "."  ;'.'s finish off commands
 BNE THUNK
 INY  ;Point to next char
 BCS FINISH  ;Always
CHKLST LDAIY LINPTR  ;Check last char non alpha
 JSR CAPS
 BCC THUNK
FINISH PLA  ;Get rid of stack
 LDAAX COMTAB
 PHA
 LDAAX COMTAB + &01
 PHA
 RTS

STXYLP STX LINPTR
 STY LINPTR + &01
 LDYIM &00
 RTS

SETUPR CLC
 JMP RDINIT

QDEL JSR SETWLD
 JSR CHKSYN
 JSR GETLOK
QDEL0 LDAAY MODIFY
 BMI QDEL4
 JSR PRTNAM
 JSR VSTRNG
 = " : ",&EA
 JSR GETYN
 BNE QDEL2
 JSR CHKSAM
 JSR DELDEC
 JSR DIROUT
QDEL2 JSR PCRLF
QDEL4 JSR NEXT
 BCS QDEL0
 RTS

DELETE JSR CLRWLD
 JSR CHKSYN
 JSR GETLOK
 JSR INFORM
 JSR DELFIL
 JMP DIROUT

 [ NOENAB=0
DESTRY
 |
DESTRY JSR CHKENA
 ]
 JSR SETWLD
 JSR CHKSYN
 JSR GETLOK
DESTR1 LDAAY MODIFY
 BMI DESTR5
 JSR PRTNAM
 JSR PCRLF
DESTR5 JSR NEXT
 BCS DESTR1
;  JSR VSTRNG
;  = CR,"Delete (Y/N) ? ",$EA
;  JSR GETYN
 JSR SURE

 BEQ DESTR2
 JMP PCRLF
DESTR2 JSR CHKSAM
 JSR LOOKUP
DESTR3 LDAAY MODIFY
 BMI DESTR4
 JSR DELDEC
DESTR4 JSR NEXT
 BCS DESTR3
 JSR DIROUT
 JSR VSTRNG
 = CR,"Deleted",CR

;Increment Y by 8
STEP INY
STEP7 INY
 INY
 INY
 INY
 INY
 INY
 INY
 RTS


DELDEC JSR DELFIL
 LDY VTEMP
 JSR UNSTEP
 STY VTEMP
 RTS

 [ DRIVEC=0
DRIVE JSR CHKSYN
 JSR GETDRV
 STA DEFDSK
 |
 ]

DODRIV JSR DSKWAI
 ANDIM &03
 STA FDRIVE
 RTS

;Load file with block at X and wait
LOADER JSR FRMLOK
 JSR TRYFL0
 JSR CHUKBK

;Load file set up in WORK
LOADT STY WORK
 LDXIM &00
 LDA WORK + &04
 BNE RELOC
 INY
 INY
 LDXIM &02
 BNE LOADT0
RELOC LDAAY CATHIG + &06
 STA WORK + &08
 JSR DECODL
LOADT0 LDAAY CATHIG
 STAZX WORK + &02
 INY
 INX
 CPXIM &08
 BNE LOADT0
 JSR DECODE
 LDY WORK
 JSR INFORM

;Read block
BLKRD JSR RDINT
 BNE BLKXX

;Save memory into file set up in WORK
SAVER JSR DIRDO
 JSR TRYFL0
 JSR CHUKBK

;Write block
BLKWR JSR WTINT
BLKXX JSR ATOT
 JSR GETTS
 LDAIM &01
 JSR DSKFIN

;Release tube conditional on whether
; you used it
 PHA
 LDA TUBFLG
 BEQ RELTB0
RELTB1 LDAIM &80 + TUBEID
 JSR TUBADR
 PLA
 RTS

;Release NMI and tube
NMTREL JSR NMIREL

;Release tube if tube exists
RELTUB PHA
 LDAIM BYTETB
 JSR READBY
 TXA
 BNE RELTB1
RELTB0 PLA
 RTS

;RUN filename as if a utility
WNOTA JSR STXYLP

;Unrecognised command - try disk for
;a utility.
DEFCOM JSR SUPLD
 STY LINADR + &01
 JSR FRMNAM
 STY LINADR
 JSR LOOKUP
 BCS DEFSUC
 LDY LINADR + &01
 LDA LIBQUA
 STA QUALIF
 LDA LIBDSK
 JSR DODRIV
 JSR FRMNM1
 JSR LOOKUP
 BCS DEFSUC
 JSR ILLMSG
 = COMNUM,"command",&00

DEFSUC JSR LOADT
 CLC  ;Work out address of line
 LDA LINADR
 TAY
 ADC LINPTR
 STA LINADR
 LDA LINPTR + &01
 ADCIM &00
 STA LINADR + &01
 LDA HIWORK + &02  ;Find where to run
 AND HIWORK + &03
 ORA NOTUBE
 CMPIM &FF
 BEQ RUNHO
 LDA WORK + &04  ;Run that side
 STA HIWORK
 LDA WORK + &05
 STA HIWORK + &01
 JSR CLATUB
 LDXIM HIWORK
 LDYIM /(HIWORK )
 LDAIM &04
 JMP TUBADR
RUNHO LDAIM &01
 JMI WORK + &04  ;Run this side

SUPLD LDAIM &FF  ;Set up load
 STA WORK + &04
 LDA LINPTR 
 STA WORK
 LDA LINPTR + &01
 STA WORK + &01
 RTS

;Set default directory and disk
SET LDXIM &00
 BEQ SLIB1

;Set library directory and disk
SLIB LDXIM LIBDSK - DEFDSK
SLIB1 JSR READDF
 STAAX DEFDSK
 LDA QUALIF
 STAAX DEFQUA
 RTS

;***** HMT
; Save in private memory
SAVMEM JSR SAVITA ; Save A,X,Y
 LDA TEMP
 PHA
 LDA TEMP+&01
 PHA

 JSR SUSPRI ; Set up the pointer

 LDYIM &00  ;Save useful things
RELME1 CPYIM &C0
 BCC RELME2
 LDAAY BUFFER
 BCS RELME3
RELME2 LDAAY SEQMAP
RELME3 STAIY TEMP
 DEY
 BNE RELME1
;************* Y=0
; Exit Y=0 always

 PLA
 STA TEMP+&01
 PLA
 STA TEMP

 RTS



;Read directory - if none default to
;MASDSK and MASQUA
READDF LDA DEFQUA ; ********** HMT
 STA QUALIF ; ********** HMT
 ; To preserve the Qual Correctly over *DIR :0
 JSR SETUPR
 BNE READD0
 LDAIM MASDSK
 JSR DODRIV
 [ MASDSK=0
 BEQ SET3
 |
 BNE SET3
 ]
READD0 LDA DEFDSK
 JSR DODRIV
SET4 JSR RDCHR
 BCS ILLDIR
 CMPIM ":"
 BNE SET0
 JSR GETDRV
 JSR RDCHR
 BCS SET3
 CMPIM "."
 BEQ SET4
ILLDIR JSR ILLMSG
 = DIRNUM,"dir",&00
SET0 STA QUALIF
 JSR RDCHR
 BCC ILLDIR
SET3 LDA FDRIVE
 RTS

TITLE JSR CHKSYN
 JSR SETDEF
 JSR GETDIR

 LDXIM &0B  ;12 Chars in title
 LDAIM &20  ;Pad with nulls
CLRTI0 JSR TITWIT
 DEX
 BPL CLRTI0

TITSET INX
 JSR RDCHR  ;Read in title
 BCS TITEND

 JSR TITWIT
 CPXIM &0B
 BCC TITSET
TITEND JMP DIROUT

;Put char in title
TITWIT CPXIM &08
 BCC TITLLW
 STAAX DIRHIG - &08
 RTS
TITLLW STAAX DIRLOW
 RTS

;Lock or unlock file
ACCESS JSR SETWLD
 JSR CHKSYN
 JSR GETNAM
 LDXIM &00
 JSR SETUPR
 BNE ACCES5
ACCES0 STX UTEMP
 JSR LOOKUP
 BCS ACCES1
 JMP NOFIL
ACCES1 JSR CHKOPN
 LDAAY MODIFY
 ANDIM &7F
 ORA UTEMP
 STAAY MODIFY
 JSR INFORM
 JSR NEXT
 BCS ACCES1
 BCC TITEND
ACCES6 LDXIM &80
ACCES5 JSR RDCHR
 BCS ACCES0
 ANDIM &5F
 CMPIM "L"
 BEQ ACCES6
 JSR ILLMSG
 = ATTNUM,"attribute",&00

WFOPT JSR SAVITA
 TXA
 CMPIM &04
 BEQ BOOTO
 CMPIM &02
 BCC SETMON
 JSR ILLMSG
 = OPTNUM,"option",&00

SETMON LDXIM &FF
 TYA
 BEQ STMON0
 LDXIM &00
STMON0 STX MONFLG
 RTS

BOOTO TYA
 PHA
 JSR SETDEF
 JSR DIRLDY
 PLA
 JSR LFOUR
 EOR DIRHIG + &06
 ANDIM &30
 EOR DIRHIG + &06
 STA DIRHIG + &06
 JMP DIROUT

NOROOM JSR DSKMSG
 = NORNUM,"full",&00

;Generate file in directory
DIRDO JSR FRMNAM
 JSR LOOKUP
 BCC FILELS
 JSR DELFIL
FILELS LDA WORK + &06
 PHA
 LDA WORK + &07
 PHA
 SEC
 LDA WORK + &08
 SBC WORK + &06
 STA WORK + &06
 LDA WORK + &09
 SBC WORK + &07
 STA WORK + &07
 LDA HIWORK + &06
 SBC HIWORK + &04
 STA WORK + &0A
 JSR GENFIL
 LDA HIWORK + &05  ;Move load address
 STA HIWORK + &01
 LDA HIWORK + &04
 STA HIWORK
 PLA
 STA WORK + &03
 PLA
 STA WORK + &02
 RTS

GENFIL LDAIM &00
 STA WORK + &08
 LDAIM &02
 STA WORK + &09
 LDY DIRLEN
 CPYIM &F8
 BCS DIRFUL
 JSR DSKSPC
 JMP SPACHK
SPALOP BEQ NOROOM
 JSR UNSTEP
 JSR DSKADR
SPACHK TYA
 BCC SPALOP
 STY TEMP
 LDY DIRLEN
MOVEUP CPY TEMP
 BEQ INSNAM
 LDAAY CATLOW - &01
 STAAY CATLOW + &07
 LDAAY CATHIG - &01
 STAAY CATHIG + &07
 DEY
 BCS MOVEUP ; Y > TEMP ?
INSNAM LDXIM &00
 JSR ENCODE
NAMIN LDAZX WORK + &0B
 STAAY CATLOW
 INY
 INX
 CPXIM &08
 BNE NAMIN
VARIN LDAZX WORK + &01
 DEY
 STAAY CATHIG
 DEX
 BNE VARIN
 JSR INFORM
 TYA
 PHA
 LDY DIRLEN
 JSR STEP
 STY DIRLEN
 JSR DIROUT
 PLA
 TAY
 RTS

DIRFUL JSR ESTRNG
 = DRFNUM,"Cat full",&00

ENCODE LDA HIWORK + &02  ;Inserts half nibbles in reverse order
 ANDIM &03  ;Starting with exec addr
 ASLA
 ASLA
 EOR WORK + &0A  ;Length
 ANDIM &FC
 EOR WORK + &0A
 ASLA
 ASLA
 EOR HIWORK  ;Load addr
 ANDIM &FC
 EOR HIWORK
 ASLA
 ASLA
 EOR WORK + &08  ;Start sec
 ANDIM &FC
 EOR WORK + &08
 STA WORK + &08  ;Finally store
 RTS

;Enable misc commands
ENABLE LDAIM &01
 STA ENAFLG
 RTS

DECODL LDAIM &00
 STA HIWORK + &01
 LDA WORK + &08
 JSR ISOLOD
 CMPIM &03
 BNE DECDL0
 LDAIM &FF
 STA HIWORK + &01
DECDL0 STA HIWORK
 RTS

DECODE LDAIM &00
 STA HIWORK + &03
 LDA WORK + &08
 JSR ISOEXE
 CMPIM &03
 BNE DECDE0
 LDAIM &FF
 STA HIWORK + &03
DECDE0 STA HIWORK + &02
 RTS

;Set up default qualifier and disk
SETDEF LDA DEFQUA
 STA QUALIF
SETDDR LDA DEFDSK
 JMP DODRIV

;Read drive - if nothing on line sets
; to default
READRV JSR SETUPR
 BEQ SETDDR

;Get drive from input string
;Produces error on invalid drive
GETDRV JSR RDCHR
 BCS DRVERR
 CMPIM ":"
 BEQ GETDRV
 SEC
 SBCIM "0"
 BCC DRVERR
 CMPIM &04
 BCS DRVERR
 JSR DODRIV
 CLC
 RTS
DRVERR JSR ILLMSG
 = DRVNUM,"drive",&00

RENAME JSR CLRWLD
 JSR CHKSYN
 JSR GETNAM
 TYA
 PHA
 JSR ERRLOK
 JSR CHKOPL
 STY ITEMP
 PLA
 TAY
 JSR CHKSYN
 LDA FDRIVE  ;Save 1st filename drive
 PHA
 JSR GETNAM
 PLA
 CMP FDRIVE  ;Check same drive
 BNE DRVERR  ;'Bad drive' error if not
 JSR LOOKUP
 BCC REN4
;************************ So REN. A a works!!!!
 CPY ITEMP ; This is the cat entry of the extant file
 BEQ REN4 ; If we're about to save in the same place
;************************
 JSR ESTRNG
 = FAXNUM,"Exists",&00
REN4 LDY ITEMP
 JSR STEP
 LDXIM &07
REN5 LDAZX WORK + &0B
 STAAY CATLOW - &01
 DEY
 DEX
 BPL REN5

;
; And drop through to DIROUT
;
EDOS02 * .

 LNK DOS03
